package datastrucure.tree;

/**
 * @Author Fizz Pu
 * @Date 2021/4/19 下午3:32
 * @Version 1.0
 * 失之毫厘，缪之千里！
 */

import java.util.ArrayList;
import java.util.List;

/**
 * 给你二叉树的根节点 root 和一个整数目标和 targetSum ，找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
 *
 * 叶子节点 是指没有子节点的节点。
 *
 *  
 *
 * 示例 1：
 *
 *
 *
 *
 * 输入：root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
 * 输出：[[5,4,11,2],[5,8,4,5]]
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/path-sum-ii
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

// 不搜索到叶子节点即可


public class Offer437 {
    private int result = 0;

    // 第一个版本
    public int pathSum(TreeNode root, int targetSum) {
        if(root == null){
            return 0;
        }
        // 一定要初始化
        this.result = 0;
        // 获取以根节点开始的路径数量
        int getResultWithRoot = dfs(root, targetSum, 0);
        // 递归获取
        return getResultWithRoot + pathSum(root.right, targetSum) + pathSum(root.left, targetSum);
    }

    private int dfs(TreeNode root, int targetSum, int sum){
        if(root == null){
            return this.result;
        }

        sum += root.val;

        if(sum == targetSum){
            this.result++;
        }

        dfs(root.left, targetSum, sum);
        dfs(root.right, targetSum, sum);

        sum -= root.val; // 可以不要
        return this.result;
    }
}
